上一篇【Rust與AI/Python完美的結合 (1)】介紹Rust與Python的整合,接著我們再來介紹【Rust與AI的整合】。
9/12 在【Hello World Dev Conference】介紹Rust,沒有太多時間討論Rust如何與AI的整合,也藉這篇文章補充說明。
機器學習開發流程可以分為10大步驟,如下圖:
說明如下:
步驟1~8屬於研發階段,必須反覆訓練模型,適合使用Python這類高生產力的語言開發,找到最佳模型後,步驟9~10會佈署至正式環境提供給客戶或使用者,進行模型推論,就不適合使用Python建構應用程式,因為:
基於以上原因,Python與Rust合作會是一個不錯的選擇,因為Rust還有其他的優勢:
在狹義的機器學習方面,Linfa是一個不錯的選擇,支援大部分經典的演算法,如迴歸(Regression)、決策樹(Decision tree)、支援向量機(Support Vector Machine)、集群(Clustering)...等,參見下圖:
至於支援深度學習的套件,較流行的有:
以下我們使用tch-rs實作深度學習專案。
要使用tch-rs,須安裝PyTorch C++/Java 函數庫,至PyTorch網站首頁下載程式,並解壓縮至c:\或d:\資料夾,可選擇CPU或GPU版,不過GPU版在Windows下測試並不順利,WSL或Linux則無問題。
tch-rs有許多範例,包括大語言模型(LLM)及Stable Diffusion等生成式AI模型,參閱下圖。
import torch
import torchvision
# 載入 ResNet 模型
model = torchvision.models.resnet18(pretrained=True)
# 編譯模型並存檔
model.eval()
example = torch.rand(1, 3, 224, 224)
traced_script_module = torch.jit.trace(model, example)
traced_script_module.save("model.pt")
cargo new load_model
cd load_model
cargo add anyhow
cargo add tch
use tch::Tensor;
use anyhow::Result;
use tch::{nn, nn::ModuleT, Device};
use std::env;
use tch::vision::{imagenet, resnet};
use anyhow::bail;
pub fn main() -> anyhow::Result<()> {
// 參數1:模型檔名,參數2:預測圖檔名稱
let args: Vec<_> = std::env::args().collect();
let (model_file, image_file) = match args.as_slice() {
[_, m, i] => (m.to_owned(), i.to_owned()),
_ => bail!("usage: main model.pt image.jpg"),
};
// 載入模型檔,並進行預測
let image = imagenet::load_image_and_resize224(image_file)?;
let model = tch::CModule::load(model_file)?;
let output = model.forward_ts(&[image.unsqueeze(0)])?.softmax(-1, tch::Kind::Float);
// 顯示前5名物件名稱及機率
for (probability, class) in imagenet::top(&output, 5).iter() {
println!("{:50} {:5.2}%", class, 100.0 * probability)
}
Ok(())
}
set LIBTORCH=C:\libtorch
set LIBTORCH_INCLUDE=C:\libtorch
set LIBTORCH_LIB=C:\libtorch
set LIBTORCH_BYPASS_VERSION_CHECK=1
set PATH=%PATH%;C:\libtorch;C:\libtorch\lib
cargo run ..\model.pt tiger.jpg
使用YOLO模型進行物件偵測,與上一個專案程序類似,不同的是,直接訓練YOLO Darknet v3模型,並進行預測。由於程式碼較大,細節不作詳細說明,請參閱yolo_test專案。
set LIBTORCH=C:\libtorch
set LIBTORCH_INCLUDE=C:\libtorch
set LIBTORCH_LIB=C:\libtorch
set LIBTORCH_BYPASS_VERSION_CHECK=1
set PATH=%PATH%;C:\libtorch;C:\libtorch\lib
cargo run ./yolo-v3.ot ./dog.jpg
以上介紹Rust與Python/AI整合的方式,可進一步建構網站提供推論服務,透過並行處理(Concurrency)機制提升效能,相關實作可參閱【以Rust開發一個網站,不是網頁喔!】。
Rust雖然具備諸多優點,但學習曲線陡峭,因此筆者最近剛完成【Rust 最佳入門與實戰】一書的撰寫,希望能與讀者分享Rust開發心得,內容除了Rust語言的入門、設計典範(Design patterns)外,也著重應用的探討,包括網頁、WebAssembly、桌面程式、資料庫、機器學習/深度學習、區塊鏈…等。
本文相關範例放在這裡,【Rust 最佳入門與實戰】還有各式各樣的範例供大家下載。